package com.mars.admin.modules.post.mapper;

import com.mars.admin.modules.post.entity.PostView;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 帖子浏览Mapper接口
 *
 * @author Mars
 * @version 1.0
 * @date 2025-01-07
 */
@Mapper
public interface PostViewMapper extends BaseMapper<PostView> {

    /**
     * 检查用户是否浏览过帖子
     *
     * @param userId 用户ID
     * @param postId 帖子ID
     * @return 是否浏览过
     */
    boolean hasViewed(@Param("userId") Long userId, @Param("postId") Long postId);

    /**
     * 检查IP是否浏览过帖子
     *
     * @param visitorIp 访客IP
     * @param postId 帖子ID
     * @return 是否浏览过
     */
    boolean hasViewedByIp(@Param("visitorIp") String visitorIp, @Param("postId") Long postId);

    /**
     * 统计帖子的浏览数
     *
     * @param postId 帖子ID
     * @return 浏览数
     */
    Long countViews(@Param("postId") Long postId);

    /**
     * 统计帖子的独立访客数
     *
     * @param postId 帖子ID
     * @return 独立访客数
     */
    Long countUniqueViews(@Param("postId") Long postId);

    /**
     * 更新浏览记录的浏览时长
     *
     * @param id 记录ID
     * @param duration 浏览时长
     * @return 更新结果
     */
    int updateDuration(@Param("id") Long id, @Param("duration") Integer duration);

    /**
     * 根据帖子ID删除所有浏览记录
     *
     * @param postId 帖子ID
     * @return 删除数量
     */
    int deleteByPostId(@Param("postId") Long postId);

    /**
     * 根据用户ID查询浏览记录
     *
     * @param userId 用户ID
     * @param page 分页参数
     * @return 浏览记录列表
     */
    Page<PostView> selectByUserId(@Param("userId") Long userId, Page<PostView> page);

    /**
     * 根据帖子ID查询浏览记录
     *
     * @param postId 帖子ID
     * @param page 分页参数
     * @return 浏览记录列表
     */
    Page<PostView> selectByPostId(@Param("postId") Long postId, Page<PostView> page);

    /**
     * 根据帖子ID统计浏览数量
     *
     * @param postId 帖子ID
     * @return 浏览数量
     */
    int countByPostId(@Param("postId") Long postId);

    /**
     * 根据用户ID统计浏览数量
     *
     * @param userId 用户ID
     * @return 浏览数量
     */
    int countByUserId(@Param("userId") Long userId);

    /**
     * 根据IP统计浏览数量
     *
     * @param visitorIp 访客IP
     * @return 浏览数量
     */
    int countByIp(@Param("visitorIp") String visitorIp);

    /**
     * 查询热门浏览的帖子ID列表
     *
     * @param limit 限制数量
     * @return 帖子ID列表
     */
    List<Long> selectHotViewedPostIds(@Param("limit") Integer limit);

    /**
     * 根据帖子ID和用户ID查询浏览记录
     *
     * @param postId 帖子ID
     * @param userId 用户ID
     * @return 浏览记录
     */
    PostView selectByPostIdAndUserId(@Param("postId") Long postId, @Param("userId") Long userId);

    /**
     * 根据帖子ID和IP查询浏览记录
     *
     * @param postId 帖子ID
     * @param visitorIp 访客IP
     * @return 浏览记录
     */
    PostView selectByPostIdAndIp(@Param("postId") Long postId, @Param("visitorIp") String visitorIp);
} 